#pragma once

namespace mixc::macro_xmodify{
    template<class type_t> struct meta{
        using type = type_t;
    };

    template<class type_t> struct meta<type_t &>{
        using type = type_t;
    };

    template<class type_t> struct meta<type_t const &>{
        using type = type_t;
    };

    template<class type_t>
    using remove_ref = typename meta<type_t>::type;
}

// 这里使用嵌套的 xmodify() 是针对 xhint() 这样接口优化的，避免在 xhint() 中使用 xmodify() 导致打印一堆杂乱的信息
// 请直接使用 xmodify()，而非 xmodify2() xmodify3()
#define xmodify3(...)                                                                               \
    (                                                                                               \
        (::mixc::macro_xmodify::remove_ref<decltype(__VA_ARGS__)> *)                                \
        (& (void* &)(::mixc::macro_xmodify::remove_ref<decltype(__VA_ARGS__)> &)(__VA_ARGS__))      \
    )

#define xmodify2(...)       xmodify3(__VA_ARGS__)
#define xmodify(...)        xmodify2(__VA_ARGS__)
